package base.annotation_demo.demo_01;


import lombok.extern.slf4j.Slf4j;

import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;

@IAnnotation(color = "red", arrayAttr = {6}, annotationAttr = @MetaAnnotation("雷克萨斯"))
@Slf4j
public class Car {

    public static void main(String[] args) throws Exception {
        Class<Car> clazz = Car.class;
        //clazz = (Class<Car>) Class.forName("base.annotation_demo.demo_01.Car");

        // 获得类上的所有注解
        Annotation[] annotations = clazz.getAnnotations();
        for (Annotation annotation : annotations) {//@Slf4j只在源码阶段有效，因此这里不会输出@Slf4j.
            log.info("{}", annotation);
        }
        log.info("-------------------1--------------------");
        // 获取类上指定注解
        /**NOTICE:  public <A extends Annotation> A getAnnotation(Class<A> annotationClass)
         * 这里泛型的写法，根据A的字节码获取A的实例，getAnnotation()表明获取的是一个Annotation实例，如果仅仅这样写
         *  public A getAnnotation(Class<A> class),任何类都可以这样获取实例，不符合getAnnotation()意思，
         *  因此加上了 <A extends Annotation> 限定A必须是一个Annotation.这样的话，Class<A>就表示是A这个Annotation的字节码
         *  ，限定了A只能是一个注解，getAnnotation()获取的是注解的实例。
         */
        IAnnotation iAnnotation = clazz.getAnnotation(IAnnotation.class);
        log.info("{}", iAnnotation.arrayAttr());
        log.info("-------------------2--------------------");

        // 判断Car上是否有IAnnotation注解
        if (Car.class.isAnnotationPresent(IAnnotation.class)) {
            // 获取 IAnnotation 注解
            IAnnotation annotation = Car.class.getAnnotation(IAnnotation.class);

            log.info("1 ->{}",annotation);
            log.info("2 ->{}",annotation.value());
            log.info("3 ->{}",annotation.color());
            log.info("4 ->{}",annotation.arrayAttr().length);
            log.info("5 ->{}",annotation.annotationAttr().value());
        }
    }
}
